/**
 * 树状数组支持两种操作，且时间复杂度均为 O(logn)
 * - 单点修改
 * - 区间查询
 * 树状数组解决的问题和前缀和类似，我们可以进行对比
 * 对于普通数组：单点修改的时间复杂度为 O(1)， 区间求和的时间复杂度为 O(n)
 * 对于前缀和：单点修改的时间复杂度为 O(n)，区间求和的时间复杂度为 O(1)
 * 结论：树状数组（BIT）其实是一种折中的办法。这种做法巧妙应用了二进制的原理
 * 对于树状数组而言，它维护的区间下标从 1 开始
 */
#include <iostream>
#define lowbit(x) (x & (-x))
using namespace std;
const int MAX = 5e5 + 7;
int tree[MAX];
// n 代表数字个数，m 代表操作数
int m, n;

// template <class T> inline void read(T &x) {
//   x = 0;
//   int flag = 1;
//   char ch = getchar();
//   while (ch < '0' || ch > '9') {
//     if (ch == '-')
//       flag = -1;
//     ch = getchar();
//   }

//   while (ch >= '0' && ch <= '9') {
//     x += (x << 1) + (x << 3) + (ch ^ 48);
//     ch = getchar();
//   }

//   x *= flag;
// }

// template <class T, class... K> inline void read(T &x, K &... args) {
//   read(x), read(args...);
// }

/**
 * @brief 以下操作用来进行单点修改，单点修改影响的是后面添加的值
 *
 * @param i 修改的下标
 * @param x 修改的值的大小
 */
inline void update(int i, int x) {
  for (int pos = i; pos <= n; pos += lowbit(pos)) {
    tree[pos] += x;
  }
}

inline int query(int x) {
  int res = 0;
  for (int i = x; i > 0; i -= lowbit(i)) {
    res += tree[i];
  }
  return res;
}

/**
 * @brief 区间查询，区间为左开右闭，所以需要query(start - 1)
 */
inline int query(int start, int end) { return query(end) - query(start - 1); }
int main() {
  int temp;
  int flag, x, y;
  // read(n, m);
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) {
    // read(temp);
    cin >> temp;
    update(i, temp);
  }
  while (m--) {
    // read(flag, x, y);
    cin >> flag >> x >> y;
    if (flag == 1) {
      update(x, y);
    } else {
      int res = query(x, y);
      printf("%d\n", res);
    }
  }

  return 0;
}